package com.chat.db;

public abstract class Configuration {

    // 数据连接配置
    protected final DbLinkConfigBean dbConfig;
    // 管理数据配置唯一键
    protected String key;

    /**
     * 开启单机配置
     * @param dbHost 单机地址
     * @param dbPort 端口
     * @param dbDriverName 数据库类别
     */
    protected Configuration(String dbHost, int dbPort, String dbDriverName) {
        this(dbHost.concat(DbLinkConfigBean.PORT_SEPARATOR).concat(dbPort + ""),
                dbHost.concat(DbLinkConfigBean.PORT_SEPARATOR).concat(dbPort + ""),
                dbDriverName, true);
    }

    /**
     * 通用
     * @param dbHost 多机地址或单机
     * @param dbDriverName 数据库类别
     * @param isSingle 是否单机
     */
    protected Configuration(String dbHost, String cluster, String dbDriverName, boolean isSingle) {
        // TODO 变量的判定
        dbConfig = new DbLinkConfigBean(dbHost, cluster, dbDriverName);
        dbConfig.setIsSingle(isSingle);
    }

    /**
     * 获取唯一键
     * @return 唯一键
     */
    public String getKey() {
        if (key == null) key = dbConfig.getHosts();
        return key;
    }

    /**
     * 获取数据配置信息
     * @return 数据配置
     */
    public DbLinkConfigBean getDbConfig() {
        return dbConfig;
    }

    public void configure() {
        // 统一分配管理对象中的资源
        // 一般系统连接对应主机和端口都是唯一的,所以采用主机和端口作为配置唯一键
        // 统一key获取和判定,使用getKey()
        if (ConfigurationPool.getInstance().isExist(getKey())) return;
        // 如果统一管理对象中不存在则新建
        ConfigurationPool.getInstance().put(getKey(), this);
    }

    /**
     * 生成数据操作对象工厂
     * @return 数据操作对象工厂
     */
    public abstract SessionFactory buildSessionFactory();
}
